# import keyword
# print(keyword.kwlist)

# 类名： 每个单词首字母都大写， 驼峰名(MyTools)   具有一定意义
# 类注释： 三引号  位于类名下侧
# class MyTools:
#     """
#     关于类的说明
#     """

# 类名()  可以生成一个类的实例(mt)
# mt = MyTools()
# mt2 = MyTools()
# mt3 = MyTools()
# print(type(MyTools), mt, type(mt))


# def my_tools(a):
#     """
#     函数
#     :param a: 形参
#     :return: 返回值
#     """
#     return a
#
# # 函数名()  可以执行函数
# r = my_tools(10)
# print(type(my_tools), r)


# class Person:
#     """
#     Person 类 是抽象的 name 和 age没有具体的值
#     """
#     def __init__(self,_name, _age):
#         """
#         类的初始化函数 ，用于初始化实例 数据
#         self 代表的就是未来构造出来的实例 比如p1、p2
#         """
#         print("初始化函数执行了", id(self))
#         # 通过点 给self中添加属性与值
#         self.name = _name
#         self.age = _age
#
#
# # 构造实例时会执行初始化函数，通过初始化函数初始化实例数据
# # p1 和 p2 是Person的两个具体的实例  实例有具体的name 和 age
# p1 = Person("小明", 15)
# print(id(p1), p1.name, p1.age)
#
# p2 = Person("小李", 18)
# print(id(p2), p2.name, p2.age)





class Person:
    """
    类封装 数据(name)以及数据对应的操作(get_name, set_name)
    """
    def __init__(self, name, age, sex):
        print(f"初始化函数执行了")
        # print(id(self))
        self.name = name
        self.age = age
        self.sex = sex

    def get_age(self):
        return self.age

    def set_age(self, age):
        self.age = age

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

    def get_sex(self):
        return self.sex

    def set_sex(self, sex):
        self.sex = sex

    def __str__(self):
        """
        打印实例 时会打印str函数的返回值
        :return:  只能返回字符串
        """
        return f"姓名:{self.get_name()}\t年纪:{self.get_age()}\t性别:{self.get_sex()}"

p1 = Person("小明", 15, "男")
# print(id(p1))
print(p1.name)
print(p1.get_name())
p1.set_name("小白")
print(p1.name, p1.get_name())
p1.set_age(25)

print(p1.get_name(), p1.get_age())

p1.set_sex("保密")
print(p1.sex, p1.get_sex())

print(p1)


p2 = Person("小黑", 30, "男")
print(p2)

















